/**
 * @author heguochang
 * @version Id: ReverseList.java, v 0.1 2021/10/17 下午5:32 heguochang Exp $$
 */
public class ReverseList {

    /**
     * 定义一个链表结点
     */
    static class ListNode {
        // 结点值
        int val;
        // 下一个结点的指针
        ListNode next;

        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    /**
     * 迭代法
     *
     * @return
     */
    public static ListNode iterate(ListNode head) {

        // 定义,前一个结点,当前结点,下一个结点
        ListNode prev = null;
        ListNode current = null;
        ListNode next = null;

        // 将当前结点设置为头结点
        current = head;

        // 开始迭代,当前结点不为null时,继续进行
        while (current != null) {

            // 先取出下一个结点
            next = current.next;

            // 当前结点的下一个结点,应该指向pre--转向
            current.next = prev;

            // 将一结点的指针设置为当前结点,用于下一结点的next赋值
            prev = current;

            // 向后移一个结点继续处理
            current = next;

        }

        return prev;
    }

    public static void main(String[] args) {
        ListNode listNode5 = new ListNode(5, null);
        ListNode listNode4 = new ListNode(4, listNode5);
        ListNode listNode3 = new ListNode(3, listNode4);
        ListNode listNode2 = new ListNode(2, listNode3);
        ListNode listNode1 = new ListNode(1, listNode2);

        ListNode iterate = iterate(listNode1);

        while (iterate != null) {
            System.out.println(iterate.val);
            iterate = iterate.next;
        }
    }

}